﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Data;
using System.IO;
using produccion.vistamodelo;
using System.ComponentModel;

namespace produccion.forms
{
    /// <summary>
    /// Lógica de interacción para FRMmanPreRef.xaml
    /// </summary>
    public partial class FRMmanPreRef : Window
    {
        manPreRef _manPreRef;

        public FRMmanPreRef()
        {
            InitializeComponent();
            _manPreRef = (manPreRef)this.DataContext;
        }

        private void butGua_Click(object sender, RoutedEventArgs e)
        {
            _manPreRef.guardar(wPnot);
            texCod.Focus();
            texCod.Select(0,0);
        }

        string camb;
        
        private void texCod_TextChanged(object sender, TextChangedEventArgs e)
        {

            if (_manPreRef.txtRef.CODREF_REF != camb)
            {
                if (_manPreRef.txtRef.CAMBIO)
                {
                    if (MessageBox.Show("¿Está seguro que desea cambiar de elemento? se perderán los cambios no guardados.", "Confirmar", MessageBoxButton.OKCancel, MessageBoxImage.Question) == MessageBoxResult.Cancel)//RRR
                    {
                        _manPreRef.txtRef.CODREF_REF = camb;
                        return;
                    }
                    _manPreRef.txtRef.CAMBIO = false;
                }
                camb = _manPreRef.txtRef.CODREF_REF;
                _manPreRef.Consultar();
                _manPreRef.visorFotoReferencia.strCodigo = texCod.Text;
                if (!_manPreRef.txtRef.EXISTE)
                {
                   _manPreRef.lmanPreRef.Clear();
                   dtLisPre.Columns.Clear();
                   _manPreRef.txtRef.CAMBIO = false;
                }
            }
           
        }

        private void butSal_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }

        public static Style newCellStyleAlinearDerecha()
        {
            System.Windows.Style style = new Style(typeof(DataGridCell));
            style.Setters.Add(new System.Windows.Setter
            {
                Property = Control.HorizontalAlignmentProperty,
                Value = HorizontalAlignment.Right
            });
            return style;
        }

        private void dtLisPre_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {
            if (e.Column.Header.ToString() == "Codigo_color")
            {
                    e.Cancel = true;
            }

            if (e.Column.Header.ToString() != "Codigo_color" && e.Column.Header.ToString() != "Color")
            {
                Style MyStyleTextAlignmentProperty = new Style(typeof(DataGridCell));//FJRF - Creamos un nuevo estilo para la celda
                MyStyleTextAlignmentProperty.Setters.Add(new Setter(TextBlock.TextAlignmentProperty, TextAlignment.Right));//FJRF - Alineamos los datos de la celda a la derecha

                (e.Column as DataGridTextColumn).Binding.StringFormat = "{0:##,##}" ; 
                (e.Column as DataGridTextColumn).CellStyle = MyStyleTextAlignmentProperty;
            }

            if (e.Column.Header.ToString() == "Color")
            {
               dtLisPre.Items.GroupDescriptions.Clear();
               dtLisPre.Items.GroupDescriptions.Add(new PropertyGroupDescription("Color"));
            }

            if (_manPreRef.editColumna(e.Column.Header.ToString()))
            {
                e.Column.IsReadOnly = true;
                DataGridBoundColumn c = (DataGridBoundColumn)e.Column;
                c.CellStyle = (Style)FindResource("estilo");
            }
            else 
            {
                Binding binding = (Binding)((DataGridBoundColumn)e.Column).Binding;
                binding.ValidationRules.Add(new ReglasValidacion.esOKentero { Maxc = 12, Minc = 0, Maxv = "*", Minv = "*" });
                //binding.Converter=new ReglasFormato.FormatoDecimal();
                binding.ValidatesOnDataErrors = true;
                binding.ValidatesOnExceptions = true;
                binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
                DataGridBoundColumn c = (DataGridBoundColumn)e.Column;
                c.EditingElementStyle = (Style)FindResource("styTxtError");
            }
            
        }

        private void bRepetir_Click(object sender, RoutedEventArgs e)
        {
           
            if (dtLisPre.SelectedIndex>-1)
            {
                _manPreRef.RepeTir(nombreCol, dtLisPre.SelectedIndex);
            }
             
        }

        string nombreCol;
        private void dtLisPre_CurrentCellChanged(object sender, EventArgs e)
        {
            if (dtLisPre.CurrentCell.Column != null)
            {
                nombreCol = dtLisPre.CurrentCell.Column.Header.ToString();
            }           
        }

        private void dtLisPre_BeginningEdit(object sender, DataGridBeginningEditEventArgs e)
        {
           _manPreRef.txtRef.CAMBIO = true;          
        }


        private void dtLisPre_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (dtLisPre.SelectedIndex != -1) {

                _manPreRef.visorFotoReferencia.strCodigo = texCod.Text;
                _manPreRef.visorFotoReferencia.strColor = _manPreRef.lmanPreRef.Rows[dtLisPre.SelectedIndex]["Codigo_color"].ToString();
            }
        }

        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            
            if (_manPreRef.txtRef.CAMBIO)
            {
                if (MessageBox.Show("¿Está seguro que desea salir? se perderán los cambios no guardados.", "Confirmar", MessageBoxButton.OKCancel, MessageBoxImage.Question) == MessageBoxResult.Cancel)
                {
                    e.Cancel = true;
                }
                else 
                {
                    _manPreRef.txtRef.CAMBIO = false;
                }
                
            }
             
        }

        private void buscRef(object sender, RoutedEventArgs e)
        {
                     FRMBuscarCol f = new FRMBuscarCol();
                     f.EsReferencia = true;
                     f.RequiereColor = false;
                     f.Retorno = "";
                     f.ShowDialog();

                     if (!f.Retorno.Equals(""))
                     {
                         texCod.Text = f.Retorno;
                         return;
                     }
                    if (texCod.Text == f.Retorno)
                     {
                         texCod_TextChanged(null, null);
                     }
        }

        private void dtLisPre_LostFocus(object sender, RoutedEventArgs e)
        {
   
            Boolean errors = (from c in
                                  (from object i in dtLisPre.ItemsSource
                                   select dtLisPre.ItemContainerGenerator.ContainerFromItem(i))
                              where c != null
                              select Validation.GetHasError(c)).FirstOrDefault(x => x);

           _manPreRef.ERROR = errors;
        
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            Keyboard.Focus(texCod);
        }

        private void dtLisPre_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.Enter && elemento != null)
            {
                e.Handled = true;
                elemento.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
            }
        }

        private void Window_KeyDown(object sender, KeyEventArgs e)
        {
            var elemento = e.OriginalSource as UIElement;
            if (e.Key == Key.F3 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta == true) { MDOgeneral.logBusquedadAbierta = false; }
            }

            if (e.Key == Key.F4 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta1 == true) { MDOgeneral.logBusquedadAbierta1 = false; }
            }

            if (e.Key == Key.F5 && elemento != null)
            {
                if (MDOgeneral.logBusquedadAbierta2 == true) { MDOgeneral.logBusquedadAbierta2 = false; }
            }
        }

    }

    internal class manPreRef:ObservableObject
    {

        #region propiedades

        //-----------------------------------------------------------
        private string _strTituloVentana;
        public string strTituloVentana
        {
            get { return _strTituloVentana; }
            set { _strTituloVentana = value; RaisePropertyChangedEvent("strTituloVentana"); }
        }

        private VMbuscarReferencia _buscarReferencia;
        public VMbuscarReferencia buscarReferencia
        {
            get { return _buscarReferencia; }
            set { _buscarReferencia = value; RaisePropertyChangedEvent("buscarReferencia"); }
        }

        //Enlaza los campos de texto para mostrar la descripccion de la referencia
        private clases.CLSMAEREF _txtRef = new clases.CLSMAEREF();
        public clases.CLSMAEREF txtRef
        {
            get { return _txtRef; }
            set { _txtRef = value; RaisePropertyChangedEvent("txtRef"); }
        }

        //Enlaza el DataGrid con la informacion requerida
        private DataTable _lmanPreRef=new DataTable();
        public DataTable lmanPreRef 
        {
            get { return _lmanPreRef; }
            set { _lmanPreRef =value; RaisePropertyChangedEvent("lmanPreRef"); }
        }

        private VMvisorFotoReferencia _visorFotoReferencia = new VMvisorFotoReferencia();
        public VMvisorFotoReferencia visorFotoReferencia
        {
            get { return _visorFotoReferencia; }
            set { _visorFotoReferencia = value; RaisePropertyChangedEvent("visorFotoReferencia"); }
        }

        //Lista de precios (Valores con formato para mostrar)
        private clases.CLSMAETARP _lisPre = new clases.CLSMAETARP();
        public clases.CLSMAETARP lisPre
        {
            get { return _lisPre; }
            set { _lisPre = value; RaisePropertyChangedEvent("lisPre"); }
        }

        //Valores con formato para guaradar
        private List<clases.CLSMAETARP> _cambLisPre = new List<clases.CLSMAETARP>();
        public List<clases.CLSMAETARP> cambLisPre
        {
            get { return _cambLisPre; }
            set { _cambLisPre = value; RaisePropertyChangedEvent("cambLisPre"); }
        }

        //Valores sin formato
        public DataTable valoresLispre = new DataTable();

        //Error DataGrid
        Boolean _ERROR = false;
        public Boolean ERROR
        {
            get { return _ERROR; }
            set { _ERROR = value; RaisePropertyChangedEvent("ERROR"); }
        }

        #endregion

        #region metodos

        public manPreRef()
        {
            try
            {
                buscarReferencia = new VMbuscarReferencia();
                buscarReferencia.TieneColor = false;
                buscarReferencia.PropertyChanged += onBuscarReferenciaPropertyChanged;

                MDOgeneral.conectar();
                strTituloVentana = "Actualización de precios de referencias - Usuario: " + MDOgeneral.usuario + " - [FRMmanPreRef]";
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        void onBuscarReferenciaPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            try
            {
                if (e.PropertyName == "IsOpen")
                {
                    if (!buscarReferencia.IsOpen)
                    {
                        foreach (string x in buscarReferencia.listaProducto)
                        {
                            txtRef.CODREF_REF = x;
                        }
                    }
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        RelayCommand _cmdBuscarReferencia;
        public ICommand cmdBuscarReferencia
        {
            get
            {
                if (_cmdBuscarReferencia == null)
                {
                    _cmdBuscarReferencia = new RelayCommand(r => buscar_referencia());
                }
                return _cmdBuscarReferencia;
            }
        }

        private void buscar_referencia()
        {
            try
            {
                buscarReferencia.IsOpen = true;
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        public void Consultar() 
        {
            txtRef.Consultar();
            if (txtRef.EXISTE)
            {
                lisPre.CODREF_TAR= txtRef.CODREF_REF;
                valoresLispre = lisPre.consPreRef();
                formListPrecio();
            }
            else 
            {
                lmanPreRef.Clear();
            }
        }

        private void formListPrecio() 
        {
            String StrDatoParaAgregar = "";//FJRF - Creamos una variable para armar los datos que se agregaran iniciando la variable vacia

            lmanPreRef.Clear();

            DataView valores = valoresLispre.DefaultView;
            //valores.Sort = "TIPLIS_PRE desc, CODREF_PRO, CODCOL_PRO, CODTAL_PRO";
            valores.Sort = "CODLIS_PRE";
            
            DataTable estrucutura = new DataTable();
            estrucutura.Columns.Add("Codigo_color");
            estrucutura.Columns.Add("Color");
            estrucutura.Columns.Add("Talla");

            string lista="";
            for (int i = 0; i <= valores.Count-1; i++) 
            {
                if (lista.Equals(""))
                {
                    lista = valores[i]["NOMLIS_PRE"].ToString();
                    if (!valores[i]["NOMLIS_PRE"].ToString().Equals(""))
                    {
                        StrDatoParaAgregar = "(" + valores[i]["CODLIS_PRE"].ToString() + ") " + lista;//FJRF - Armamos los datos a agregar
                        estrucutura.Columns.Add(StrDatoParaAgregar, typeof(Int32));//FJRF - Asignamos el dato
                    }
                }
                if (!lista.Equals(valores[i]["NOMLIS_PRE"].ToString())) 
                {
                    if (!valores[i]["NOMLIS_PRE"].ToString().Equals(""))
                    {
                        lista = valores[i]["NOMLIS_PRE"].ToString();

                        StrDatoParaAgregar = "(" + valores[i]["CODLIS_PRE"].ToString() + ") " + lista;//FJRF - Armamos los datos a agregar

                        Boolean BooDatoExiste = false;
                        for (int IntColumnaActual = 0; IntColumnaActual <= estrucutura.Columns.Count - 1; IntColumnaActual++)
                        { 
                            String StrColumna;
                            StrColumna = estrucutura.Columns[IntColumnaActual].ColumnName;

                            if (StrDatoParaAgregar == StrColumna)
                            {
                                BooDatoExiste = true;
                            }
                        }
                        if (BooDatoExiste == false)
                        {
                            estrucutura.Columns.Add(StrDatoParaAgregar, typeof(Int32));//FJRF - Asignamos el dato
                        }
                    }
                }
            }

            //valores.Sort = "CODCOL_PRO,CODTAL_PRO DESC";
            valores.Sort = "TIPLIS_PRE desc, CODREF_PRO, CODCOL_PRO, CODTAL_PRO";
          
            string colortalla = "";
            int c = 0;
            DataRow r;

            //String StrValor = "";

            for (int i = 0; i <= valores.Count - 1; i++)
            {
                if (!(valores[i]["CODCOL_PRO"].ToString() + valores[i]["CODTAL_PRO"].ToString()).Equals(""))
                {
                    if (colortalla.Equals(""))
                    {
                        c = 0;
                        r = estrucutura.NewRow();
                        colortalla = valores[i]["CODCOL_PRO"].ToString() + valores[i]["CODTAL_PRO"].ToString();
                        r["Codigo_color"] = valores[i]["CODCOL_PRO"].ToString();
                        r["Color"] = valores[i]["NOMCOL"].ToString();
                        r["Talla"] = valores[i]["CODTAL_PRO"].ToString();
                        if (!valores[i]["NOMLIS_PRE"].ToString().Equals(""))
                        {
                            //StrValor =Double.Parse(valores[i]["VALOR_TAR"].ToString()).ToString("#,##0");
                            //r["(" + valores[i]["CODLIS_PRE"].ToString() + ") " + valores[i]["NOMLIS_PRE"].ToString()] = StrValor;

                            r["(" + valores[i]["CODLIS_PRE"].ToString() + ") " + valores[i]["NOMLIS_PRE"].ToString()] = Convert.ToInt32(valores[i]["VALOR_TAR"]);
                        }
                        estrucutura.Rows.Add(r);
                    }
                    if (colortalla != valores[i]["CODCOL_PRO"].ToString() + valores[i]["CODTAL_PRO"].ToString())
                    {
                        c++;
                        r = estrucutura.NewRow();
                        colortalla = valores[i]["CODCOL_PRO"].ToString() + valores[i]["CODTAL_PRO"].ToString();
                        r["Codigo_color"] = valores[i]["CODCOL_PRO"].ToString();
                        r["Color"] = valores[i]["NOMCOL"].ToString();
                        r["Talla"] = valores[i]["CODTAL_PRO"].ToString();
                        if (!valores[i]["NOMLIS_PRE"].ToString().Equals(""))
                        {
                            r["(" + valores[i]["CODLIS_PRE"].ToString() + ") " + valores[i]["NOMLIS_PRE"].ToString()] = Convert.ToInt32(valores[i]["VALOR_TAR"]);
                        }
                        estrucutura.Rows.Add(r);
                    }
                    else
                    {
                        estrucutura.Rows[c]["Codigo_color"] = valores[i]["CODCOL_PRO"].ToString();
                        estrucutura.Rows[c]["Color"] = valores[i]["NOMCOL"].ToString();
                        estrucutura.Rows[c]["Talla"] = valores[i]["CODTAL_PRO"].ToString();
                        if (!valores[i]["NOMLIS_PRE"].ToString().Equals(""))
                        {
                            estrucutura.Rows[c]["(" + valores[i]["CODLIS_PRE"].ToString() + ") " + valores[i]["NOMLIS_PRE"].ToString()] = Convert.ToInt32(valores[i]["VALOR_TAR"]);
                        }

                    }
                }

            }
            lmanPreRef = estrucutura;
            lmanPreRef.AcceptChanges();
        }

        public Boolean editColumna(string nombre) 
        {
            nombre = nombre.Split(' ')[0].Replace("(", "").Replace(")", "");
            DataRow[] r;
            r = valoresLispre.Select("CODLIS_PRE='" + nombre + "'");
            if (r.Length != 0)
            {
                if (r[0]["TIPLIS_PRE"].ToString() == "C")
                {
                    return true;
                }
            }
            else 
            {
                return true;
            }
          
            return false;
        }

        public void RepeTir(string nombre,int index) 
        {
        
            if (!editColumna(nombre)) 
            {
                string valor=lmanPreRef.Rows[index][nombre].ToString();
                for (int i = index+1; i <= lmanPreRef.Rows.Count-1; i++) 
                {
                    lmanPreRef.Rows[i][nombre] = valor;
                }
            }
           
        }

        public void guardar(WrapPanel wPnot)
        {
            try
            {
                if (txtRef.EXISTE)
                {
                    formCamLisPre();
                    if (lisPre.guardar(cambLisPre) > 0)
                    {
                        txtRef.CAMBIO = false;
                        new MDOgeneral.notificar(wPnot, "Los cambios fueron guardados satisfactoriamente.", true);
                    }
                    else
                    {
                        new MDOgeneral.notificar(wPnot, "Los cambios no pueden ser guardados.", false);
                    }
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
         
        }

        private void formCamLisPre() 
        {
            clases.CLSMAETARP fila = new clases.CLSMAETARP();
          
            for (int i = 0; i <= lmanPreRef.Rows.Count - 1;i++)
            {
                if (lmanPreRef.Rows[i].RowState == DataRowState.Modified)
                {
                    for (int j = 0; j <= lmanPreRef.Columns.Count - 1; j++)
                    {
                        if (!editColumna(lmanPreRef.Columns[j].ColumnName))
                        {
                            if (lmanPreRef.Rows[i][j].ToString() == "")
                            {
                                lmanPreRef.Rows[i][j] = "0";
                            }
                            fila = new clases.CLSMAETARP
                            {
                                CODLIS_TAR = lmanPreRef.Columns[j].ColumnName.Split(' ')[0].Replace("(", "").Replace(")", ""),
                                CODREF_TAR = txtRef.CODREF_REF,
                                CODCOL_TAR = lmanPreRef.Rows[i]["Codigo_color"].ToString(),
                                CODTAL_TAR = lmanPreRef.Rows[i]["Talla"].ToString(),
                                VALOR_TAR =Convert.ToInt32(lmanPreRef.Rows[i][j])
                            };
                            cambLisPre.Add(fila);
                        }
                    }
                }
            }
             
        }

        #endregion

    }
}
    